#include "led.h"
#include "FreeRTOS.h"
#include "task.h"

extern TaskHandle_t xTaskLED1Handler;
extern TaskHandle_t xTaskLED2Handler;
extern TaskHandle_t xTaskLED3Handler;

void LED1Task(void* pvParameters) {
    while (1) {
        ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
        gpio_bit_toggle(GPIOD, GPIO_PIN_8);
        vTaskDelay(500);
        gpio_bit_toggle(GPIOD, GPIO_PIN_8);
        xTaskNotifyGive(xTaskLED2Handler);
    }
}

void LED2Task(void* pvParameters) {
    while (1) {
        ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
        gpio_bit_toggle(GPIOD, GPIO_PIN_9);
        vTaskDelay(500);
        gpio_bit_toggle(GPIOD, GPIO_PIN_9);
        xTaskNotifyGive(xTaskLED3Handler);
    }
}

void LED3Task(void* pvParameters) {
    while (1) {
        ulTaskNotifyTake(pdFALSE, portMAX_DELAY);
        gpio_bit_toggle(GPIOD, GPIO_PIN_10);
        vTaskDelay(500);
        gpio_bit_toggle(GPIOD, GPIO_PIN_10);
        xTaskNotifyGive(xTaskLED1Handler);
    }
}

static void gpio_config(rcu_periph_enum rcu, uint32_t port, uint32_t pin) {
    // 1. 时钟初始化
    rcu_periph_clock_enable(rcu);
    // 2. 配置GPIO 输入输出模式
    gpio_mode_set(port, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, pin);
    // 3. 配置GPIO 输出选项
    gpio_output_options_set(port, GPIO_OTYPE_PP, GPIO_OSPEED_MAX, pin);
    // 4. 默认输出电平(低电平点亮LED以及导通总开关三极管)
    gpio_bit_write(port, pin, SET);
}

void led_init() {
    gpio_config(RCU_GPIOC, GPIOC, GPIO_PIN_6);
    gpio_bit_write(GPIOC, GPIO_PIN_6, RESET);   // 打开开关
    gpio_config(RCU_GPIOD, GPIOD, GPIO_PIN_8 | GPIO_PIN_9 | GPIO_PIN_10);
}
